﻿<Authorize()>
Public Class DireccionController
    Inherits BaseController(Of Dirección)

    Private ReadOnly repoDirección_ As DirecciónRepository
    Private ReadOnly repoTipoVía_ As TipoVíaRepository
    Private ReadOnly repoPoblación_ As PoblaciónRepository

    Public Sub New(ByVal repoPediatraAsindo As PediatraAsindoRepository, ByVal saver As ContextSaver,
        ByVal repoTipoVía As TipoVíaRepository,
        ByVal repoPoblación As PoblaciónRepository,
        ByVal repoDirección As DirecciónRepository)

        MyBase.New(repoPediatraAsindo, saver)
        repoDirección_ = repoDirección
        repoTipoVía_ = repoTipoVía
        repoPoblación_ = repoPoblación
    End Sub

    Protected Overrides Sub CargarDatosComunes()
        ViewData("ListaPoblaciones") = repoPoblación_.Desplegable
        ViewData("ListaTiposVia") = repoTipoVía_.Desplegable
    End Sub

    '
    ' GET: /Direccion

    Function Lista() As ActionResult
        Return Mostrar(repoDirección_.All _
                        .OrderBy(Function(direc) If(direc.Población Is Nothing, "", direc.Población.Nombre)) _
                        .ThenBy(Function(direc) direc.Vía) _
                        .ThenBy(Function(direc) direc.Número) _
                        .Include("TipoVía").Include("Población").Include("Avisos").Include("Personas"),
                    "Direcciones")
    End Function


    '
    ' GET: /Direccion/Editar/5

    Function Editar(ByVal id As Integer) As ViewResult
        Dim direc = repoDirección_.GetByID(id)
        Return Mostrar(direc, String.Format("Editar dirección {0}", direc.Completa))
    End Function

    '
    ' POST: /Direccion/Editar/5

    <HttpPost()>
    Function Editar(ByVal id As Integer, ByVal fc As FormCollection) As ActionResult
        Dim direcOriginal As Dirección = Nothing
        Dim direcForm As New Dirección

        If TryUpdateModel(direcForm, "midir") Then
            Try
                Dim direcBD = repoDirección_.GetEqual(direcForm)
                If direcBD Is Nothing Then
                    ' Update original
                    direcOriginal = repoDirección_.GetByID(id)
                    direcOriginal.Copiar(direcForm)
                    Saver.Save
                Else
                    ' Redirigir los relacionados a la ya existente
                    ' y borrar la original
                    direcOriginal = repoDirección_.GetByID(id, "Personas", "Avisos")
                    Dim personas As New List(Of Persona)
                    personas.AddRange(direcOriginal.Personas)
                    For Each pers In personas
                        pers.Dirección = direcBD
                    Next
                    Dim avisos As New List(Of Aviso)
                    avisos.AddRange(direcOriginal.Avisos)
                    For Each avi In avisos
                        avi.Dirección = direcBD
                    Next
                    repoDirección_.Delete(direcOriginal, save:=False)
                    Saver.Save
                End If

                TempData("info") = String.Format("Dirección {0} modificada con éxito", direcForm)
                Return RedirectToAction("Lista")
            Catch ex As Exception
                TempData("error") = String.Format("Error al modificar la dirección ({0})", ex.Message)
                If direcOriginal Is Nothing Then
                    Return RedirectToAction("Lista")
                Else
                    Return Mostrar(
                        direcForm,
                        String.Format("Editar dirección {0}", direcOriginal.Completa),
                        "Error al editar dirección: " & ex.Message)
                End If
            End Try
        Else
            Return Editar(id)
        End If
    End Function

    Function Borrar(ByVal id As Integer) As ActionResult
        Try
            repoDirección_.DeleteById(id, save:=True)
            TempData("info") = "Dirección eliminada con éxito"
            Return RedirectToAction("Index")
        Catch ex As Exception
            TempData("error") = String.Format("Error al eliminar la dirección ({0})", ex.Message)
        End Try
        Return RedirectToAction("Index")
    End Function

    Function EncontrarVias(ByVal term As String) As JsonResult

        Dim vias As String() = repoDirección_.EncontrarVias(term)

        'Return raw text, one result on each line
        Return Json(vias, JsonRequestBehavior.AllowGet)
    End Function

    Function EncontrarDirecciones(ByVal term As String) As JsonResult

        Dim direcciones As Array = repoDirección_.EncontrarDirecciones(term)

        'Return raw text, one result on each line
        Return Json(direcciones, JsonRequestBehavior.AllowGet)
    End Function

    Protected Overrides Function VistaFormulario() As String
        Return "FormDireccion"
    End Function

    Protected Overrides Function VistaLista() As String
        Return "ListaDirecciones"
    End Function

End Class
